package com.fyl.leetcode.DFS.isLand;

import java.util.*;

/**
 * @author:fyl
 * @date 2021/5/17 17:34
 * @Modified By:
 * @Modified Date:
 * @Description: 827
 * 
 * 在二维地图上，0代表海洋，1代表陆地，我们最多只能将一格0 海洋变成1变成陆地。
 * 进行填海之后，地图上最大的岛屿面积是多少？（上、下、左、右四个方向相连的1可形成岛屿）
 * 输入: [[1, 1], [1, 0]]
 * 输出: 4
 * 解释: 将一格0变成1，岛屿的面积扩大为 4。
 */
public class LargestIsland {
    private int[][] direction = {{0, 1}, {0, -1}, {1, 0}, {-1, 0}};

    public int largestIsland(int[][] grid) {
        int result = 0;
        boolean hasZero = false;
        List<Integer> area = new ArrayList<>();
        for (int i = 0; i < grid.length; i++) {
            for (int j = 0; j < grid[i].length; j++) {
                if (grid[i][j] == 0) {
                    hasZero = true;
                    grid[i][j] = 1;
//                    result =Math.max(result,areaSize(i,j,grid));
                    grid[i][j] = 0;
                }
            }
        }
        return hasZero ? result: grid.length*grid.length ;
    }

//    private int areaSize(int i, int j, int[][] grid) {
//        if (i < 0 || j < 0 || i >= grid.length || j >= grid[i].length || grid[i][j] != 1) {
//            return 0;
//        }
//        grid[i][j] = 2;
//        int num = 1;
//        for (int[] dir : direction) {
//            num += areaSize(i + dir[0], j + dir[1], grid);
//        }
//        return num;
//
//        int N = grid.length;
//        Stack<Integer> stack = new Stack<>();
//        Set<Integer> seen = new HashSet<>();
//        stack.push(i * N + j);
//        seen.add(i * N + j);
//
//        while (!stack.isEmpty()) {
//            int code = stack.pop();
//            int r = code / N, c = code % N;
//            for (int k = 0; k < 4; ++k) {
//                int nr = r + direction[k][0], nc = c + direction[k][1];
//                if (!seen.contains(nr * N + nc) && 0 <= nr && nr < N &&
//                        0 <= nc && nc < N && grid[nr][nc] == 1) {
//                    stack.push(nr * N + nc);
//                    seen.add(nr * N + nc);
//                }
//            }
//        }
//
//        return seen.size();
//    }
}
